From: Roger Pau Monné Date: Tue, 25 Apr 2023 13:47:44 +0000 (+0200) Subject: x86/shadow: restore dropped check in sh_unshadow_for_p2m_change() X-Git-Tag: archive/raspbian/4.17.1+2-gb773c48e36-1+rpi1~1^2~27^2~3 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=8b5be1fe938f52b5d3682dee7702fd51c8cfb61b;p=xen.git x86/shadow: restore dropped check in sh_unshadow_for_p2m_change() As a result of 241702e064604dbb3e0d9b731aa8f45be448243b the mfn_valid() check in sh_unshadow_for_p2m_change() was lost. That allows sh_remove_shadows() to be called with gfns that have no backing page, causing an ASSERT to trigger in debug builds or dereferencing an arbitrary pointer partially under guest control in non-debug builds: RIP: e008:[] sh_remove_shadows+0x19f/0x722 RFLAGS: 0000000000010246 CONTEXT: hypervisor (d0v2) [...] Xen call trace: [] R sh_remove_shadows+0x19f/0x722 [] F arch/x86/mm/shadow/hvm.c#sh_unshadow_for_p2m_change+0xab/0x2b7 [] F arch/x86/mm/p2m-pt.c#write_p2m_entry+0x19b/0x4d3 [] F arch/x86/mm/p2m-pt.c#p2m_pt_set_entry+0x67b/0xa8e [] F p2m_set_entry+0xcc/0x149 [] F unmap_mmio_regions+0x17b/0x2c9 [] F do_domctl+0x11f3/0x195e [] F hvm_hypercall+0x5b1/0xa2d [] F vmx_vmexit_handler+0x130f/0x1cd5 [] F vmx_asm_vmexit_handler+0xf2/0x210 **************************************** Panic on CPU 1: Assertion 'mfn_valid(gmfn)' failed at arch/x86/mm/shadow/common.c:2203 **************************************** Fix this by restoring the mfn_valid() check in sh_unshadow_for_p2m_change(), unifying it with the rest of the checks that are done at the start of the function. This is XSA-430 / CVE-2022-42335 Fixes: 241702e064 ('x86/shadow: slightly consolidate sh_unshadow_for_p2m_change() (part II)') Signed-off-by: Roger Pau Monné Reviewed-by: Jan Beulich master commit: f6c3cb21628f7bed73cb992da400f6b36630f290 master date: 2023-04-25 15:44:54 +0200 --- diff --git a/xen/arch/x86/mm/shadow/hvm.c b/xen/arch/x86/mm/shadow/hvm.c index 29a58d9131..39abf4732d 100644 --- a/xen/arch/x86/mm/shadow/hvm.c +++ b/xen/arch/x86/mm/shadow/hvm.c @@ -814,7 +814,8 @@ static void cf_check sh_unshadow_for_p2m_change( /* Only previously present / valid entries need processing. */ if ( !(oflags & _PAGE_PRESENT) || - (!p2m_is_valid(p2mt) && !p2m_is_grant(p2mt)) ) + (!p2m_is_valid(p2mt) && !p2m_is_grant(p2mt)) || + !mfn_valid(omfn) ) return; switch ( level )